/*
 * @Author: 大D
 * @email: 857216393@qq.com
 * @Date: 2023-12-27 13:04:47
 * @Description:取消重复请求 根据 method url data params判断接口是否重复
 */

import type { IAxiosRequestConfig } from '@/apis/request/type';
// 声明一个 weakMap 用于存储每个请求的 标识 和 取消函数
const pendingMap = new Map();
// 序列化参数
export const getPendingKey = (config: IAxiosRequestConfig) => {
  let data = config.data,
    params = config.params;
  if (typeof config.data !== 'string') data = JSON.stringify(config.data);
  if (typeof config.params !== 'string') params = JSON.stringify(config.params);
  return [config.method, config.url, data, params].join('&');
};

export class AxiosCancel {
  // 添加请求
  addPending(config: IAxiosRequestConfig) {
    // 取消前面的 执行最后的请求使用
    // this.removePending(config);
    const url = getPendingKey(config);
    // 创建中止器实例
    const controller = new AbortController();
    config.signal = controller.signal;
    if (!pendingMap.has(url)) {
      // 如果当前请求不在等待中，将其添加到等待中
      pendingMap.set(url, controller);
    } else {
      //取消后面重复请求 执行第一个请求使用
      controller.abort();
    }
  }
  //   移除 重复 单个请求
  removePending(config: IAxiosRequestConfig) {
    const url = getPendingKey(config);
    if (pendingMap.has(url)) {
      // 如果当前请求在等待中，取消它并将其从等待中移除
      const abortController = pendingMap.get(url);
      abortController && abortController.abort(url);
      pendingMap.delete(url);
    }
  }
  //   移除所有等待中的请求
  removeAllPending(): void {
    pendingMap.forEach(abortController => {
      if (abortController) {
        abortController.abort();
      }
    });
    pendingMap.clear();
  }
}
